package qdu.rg05.test_srv;

import android.app.ForegroundServiceStartNotAllowedException;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;

/**
 * ----------------------------绑定模式-启动端-----------------------------------------
 * 启动端
 * 1） 调用bindservice函数
 *     参数1：显式匹配的intent对象 参数2：连接对象  参数3：状态标志
 * 2) 准备intent对象；
 *    准备连接对象
 *        a. 自定义内部类实现ServiceConnection
 *        b. 重写其抽象函数
 *            onServiceConnected 在链接完成后回调，
 *                该函数 参数1：连接名称； 【参数2：服务端返回的binder对象（代理对象）】
 *            onServiceDisconnected 在链接非正常断开后回调
 *        c. 创建该连接对象，并作为bindeservice的参数2
 * 3) 调用unbindservice取消绑定，参数为绑定时对应的连接对象,该函数的调用会在服务端引起onunbind函数䣌回调
 * -----------------------------绑定模式-服务端---------------------------------------
 * 服务端
 * 1）创建类继承service
 * 2）重写必要的生命周期函数 onbind必须重写
 * 3）准备binder对象
 *    a.创建内部类继承Binder类（IBinder）,
 *      该类有两方面的作用
 *          1）作为binder子类提供binder机制
 *          2）自定义服务逻辑
 *    b. 创建该类的对象，【并作为onbind函数的返回值】
 *
 *====================================================================================
 *  * 绑定模式与非绑定模式比较
 *  * 1）启动端调用的函数不同（bindservice unbindservcice）
 *  * 2） 绑定模式在创建服务对象时会绑定服务到客户端，但并不需要立即启动服务（绑定后，可以选择服务启动的时机），
 *  而非绑定模式则会在服务对象启动后立刻执行（并且是无限期执行）服务逻辑。
 *  * 3） 一个服务对象可以同时绑定到多个客户端
 *  +++++++++++++++++++++++++++++++++++服务分类++++++++++++++++++++++++++++++++++++++++
 *  根据生命周期不同介绍了Service组件，但还可以从不同的角度对Service进行分类
 *  按运行地点可分为本地服务和远程服务，我们当前模块介绍的都是本地服务（即服务与主线程在同一进程，或启动端与服务端在同一进程）
 *  按运行类型可分为前台服务和后台服务，当前模块中介绍的都是后台服务，前台服务(ForegroundService,我们不讲，可自学)要求必须配合通知（notification）
 *  按功能分类可分为通信服务和非通讯服务，该分类基本等同于我们讲的绑定模式和非绑定模式。
 *  最后安卓服务与线程完全不同，这里不深入介绍。
 */
public class Srv_2 extends Service {
    class Mybinder extends Binder {
        public void getService(){
            Log.i("mytag", "bind service provided.....");
        }
    }
    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("mytag","srv2 oncreate");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i("mytag","srv2 onDestory");
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("mytag","srv2 onbind");
        return new Mybinder();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.i("mytag","srv2 unbind");
        return super.onUnbind(intent);
    }
}
